package controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.lang.reflect.Method;
//继承 httpservlet HTTP请求处理集类 封装处理HTTP协议核心逻辑 复用已有能力
public class BaseController extends HttpServlet {
    //重写方法 会在收到所有HTTP请求时被调用
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的URI（统一资源标识符）
        String requestURI = req.getRequestURI(); // /schedule/add
        // 切割成字符串数组
        String[] split = requestURI.split("/");
        //取数组最后一个元素作为方法名
        String methodName = split[split.length-1];
        // 使用 反射 通过方法名获取下面的方法（获取当前类字节码对象
        Class aClass = this.getClass();
        // 使用反射获取同名方法
        try {
            // getDeclaredMethod 在aClass类中查找名称一致且参数类型一致方法并返回对象
            //基于类加载时存储的方法信息进行精确匹配，在运行时动态查找并返回复合名称和参数类型的方法
            Method declaredMethod = aClass.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //暴力 破解方法的访问修饰符的限制（确保私有方法也可被调用
            declaredMethod.setAccessible(true);
            // 执行方法
            declaredMethod.invoke(this,req,resp);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
